# coding:utf-8
'''
Created on 2011-4-3
@author: Administrator
'''

'''
在Python中创建dictionary的时候key如果是String类型，则必须加上引号。如：{'a' :　'A', 'b' : 'B'}。
经常时候dictionary的时候默认方式就显得比较繁杂。
'''
# 创建dict，使用makedict方法创建不需要给key加引号
def makedict(**kvs):
    return kvs
data = makedict(a='A', b='B', c='C')
print data

'''
在Java中如果在Map中获取不到值会返回null。但是在Python中以一个不存在的key去dictionary中获取值
则会抛出一个异常。所以获值的时候都要对异常进行处理，这是一件麻烦的事情。
'''
# 使用dict的get(key, default)方法来获取值，如果找不到key对应的值，则返回defualt而不会出现异常
print data.get('d', 'No this item')

'''
如果dict[key]存在，则使用它。如果不存在则添加一个新的dict[key]
'''
# 构建一个词到页的数字索引。使用dict.setdefault(key, defalut)函数，如果key存在则返回对应的value，
# 如果key不存在则，则将key-default键值对插入，并返回default。默认情况下default是None。
word_page = {}
def addWord(word, pagenumber):
    word_page.setdefault(word, []).append(pagenumber)
    
'''
使用dict来对函数进行分发处理。用以解决if..elif..else或switch的问题。
类似于《代码大全》中的表驱动模式。
'''
animals = []
number_of_felines = 0

def deal_with_cat():
    global number_of_felines
    print 'cat'
    animals.append('feline')
    number_of_felines += 1
def deal_with_dog():
    print 'dog'
    animals.append('canine')
def deal_with_bear():
    print 'bear'
    animals.append('ursine')
tokenDict = {'cat': deal_with_cat, 'dog' : deal_with_dog, 'bear' : deal_with_bear}
words = ['cat', 'bear', 'cat', 'dog']
for word in words:
    func = tokenDict[word]
    func()    
